// 做 preferences 的初始化操作, 我们对初始化进行封装

import preferences from '@ohos.data.preferences';

// 以 class 的形式进行封装
class PreferencesUtils {
  prefMap: Map<string, preferences.Preferences> = new Map()

  // 封装方法( 加载实例结构 ), 目的: 为了让我们的应用内可以有 preferences 使用
  // @context 执行上下文
  // @name 你存储库的名称
  async loadPreference (context, name: string) {
    // 尝试挂载了( 是一个异步方法 )
    let pref = await preferences.getPreferences(context, name)
    // 设置挂载
    this.prefMap.set(name, pref)
  }

  // 封装方法( 插入数据的方法 )
  // @name 表示你要想哪一个存储库内插入数据
  // @key 表示你要存储的数据的 属性名
  // @value 表示你要存储的数据的 属性值
  async insertValue (name: string, key: string, value: preferences.ValueType) {
    // 如果你原先有这个内容, 可以修改, 如果你原先没有这个值, 不会插入
    // 使用 put 方法
    // todo 1: 把存储库获取出来
    let pref = this.prefMap.get(name)

    // todo 2: 向存储库内插入数据
    await pref.put(key, value)
    // todo 3: 同步更新到数据库( 刷盘 )
    await pref.flush()
  }

  // 封装方法( 获取数据 )
  // 注意: 需要三个
  // @name 表示你存储库的名字
  // @key 表示你要获取的那个属性
  // @value 给一个默认值( 当你的存储库里面没有当前 key 的时候, 直接创建, 并且设置默认值为 value )
  async getValue (name: string, key: string, value: preferences.ValueType) {
    // 使用 get 方法
    // todo 1: 把存储库获取出来
    let pref = this.prefMap.get(name)

    // todo 2: 向存储库内插入数据
    // care: 如果你有这个 key, 那么就把这个 key 本身的值拿出来, 如果没有, 就把 key 和 value 设置进去, 拿到的就是 value
    let val = await pref.get(key, value)
    return val
  }
}

// 把当前这个类的实例导出
export default new PreferencesUtils()